﻿using Prism.Commands;
using Prism.Events;
using Prism.Services.Dialogs;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading.Tasks;

namespace Zhy.PrismDialog
{
    /// <summary>
    /// 主窗体业务类
    /// </summary>
    public class MainViewModel
    {
        public DelegateCommand OpenCommand { get; set; }

        public DelegateCommand Open3Command { get; set; }
        public DelegateCommand Open4Command { get; set; }

        // 属性注入：Ioc    -》MainViewModel一定得由IoC容器创建
        /// <summary>
        /// 消息订阅参数
        /// </summary>
        IEventAggregator _eventAggregator;
        /// <summary>
        /// 弹窗服务参数
        /// </summary>
        IDialogService _dialogService;

        /// <summary>
        /// 
        /// </summary>
        /// <param name="eventAggregator">消息订阅参数</param>
        /// <param name="dialogService">弹窗服务参数</param>
        public MainViewModel(IEventAggregator eventAggregator
            , IDialogService dialogService)
        {
            _eventAggregator = eventAggregator;
            _dialogService = dialogService;

            // 按钮绑定Command事件
            OpenCommand = new DelegateCommand(OnOpen);

            // 按钮绑定Command事件
            Open3Command = new DelegateCommand(OnOpen3);
            // 按钮绑定Command事件
            Open4Command = new DelegateCommand(OnOpen4);
        }
        private void OnOpen()
        {
            // 使用消息（事件总线）的方式打开弹出窗口
            _eventAggregator.GetEvent<OpenMessage>()
                .Publish("");


            // 使用窗口服务的方式打开弹出窗口
            // 使用DialogService
            // 1、传递一个名称：窗口内容对象的名称
            //                窗口内容：UCDetail   UserControl
            //                名称：“UCDetail”，应该是内容注册时候给定的名称
            // --- 前提是在IoC容器中注册了UCDetail这个名称的内容对象
            //_dialogService.ShowDialog("AAAA"); // AAAA是IOC容器注册了窗口名称
            //_dialogService.ShowDialog("UCDetail"); // UCDetail是IOC容器注册的默认页面名称
            // 每次打开的页面都是新实例

            // 2、获取弹窗关闭时的返回结果
            // ShowDialog(string name, Action<IDialogResult> callback)
            _dialogService.ShowDialog("AAAA", new Action<IDialogResult>(OnDialogClosed)); // 打开窗口带回调函数

            // 弹窗：请求参数。。。。。。
        }

        /// <summary>
        /// 弹窗：请求参数代码例子
        /// </summary>
        private void OnOpen3() 
        {
            // 3、弹窗：请求参数。。。。。。
            // IDialogParameters parameters：传给弹窗的参数信息  键值对集合
            DialogParameters param = new DialogParameters();
            param.Add("svsdvsf", "Hello Dialog");
            _dialogService.ShowDialog("AAAA", param, OnDialogClosed);
        }

        /// <summary>
        /// 使用特定弹窗对象
        /// </summary>
        private void OnOpen4()
        {
            //4、可以根据注册Dialog窗口的名称，使用特定的窗口对象
           // IDialogParameters parameters：传给弹窗的参数信息  键值对集合
            DialogParameters param = new DialogParameters();
            param.Add("svsdvsf", "Hello Dialog");
            // Dialog1：是指注册的弹窗窗体名称
            // 注册的窗口名称，如果指定了，在容器中必须存在这个名称的
            // 否则报错：Exception：No registered type IDialogWindow with the key Dialog1.
            _dialogService.ShowDialog("AAAA", param, OnDialogClosed, "Dialog1");
        }

        /// <summary>
        /// 窗体调用返回函数
        /// </summary>
        /// <param name="result"></param>
        private void OnDialogClosed(IDialogResult result)
        {
           var str= result.Parameters.GetValue<bool>("A");  // 获取返回的结果
            var str2 = result.Parameters.GetValues<bool>("A").FirstOrDefault();  // 获取返回的结果
        }
    }
}
